// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.omnibox;

import org.jni_zero.JniType;
import org.jni_zero.NativeMethods;

import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab;

/**
 * Java bridge to handle conditional prerendering using autocomplete results * as the user types
 * into the Omnibox.
 *
 * <p>OmniboxPrerender takes keystrokes, autocomplete results and navigation actions then feeds them
 * to the (native) AutocompleteActionPredictor. The predictor uses this data to update its database
 * and returns predictions on what page, if any, to pre-render or pre-connect.
 */
public class OmniboxPrerender {
    private long mNativeOmniboxPrerender;

    /** Constructor for creating a OmniboxPrerender instanace. */
    public OmniboxPrerender() {
        mNativeOmniboxPrerender = OmniboxPrerenderJni.get().init(OmniboxPrerender.this);
    }

    /**
     * Clears the transitional matches. This should be called when the user stops typing into the
     * omnibox (e.g. when navigating away, closing the keyboard or changing tabs)
     *
     * @param profile profile instance corresponding to the active profile.
     */
    public void clear(Profile profile) {
        OmniboxPrerenderJni.get().clear(mNativeOmniboxPrerender, OmniboxPrerender.this, profile);
    }

    /**
     * Initializes the underlying action predictor for a given profile instance. This should be
     * called as soon as possible as the predictor must register for certain notifications to
     * properly initialize before providing predictions and updated its learning database.
     *
     * @param profile profile instance corresponding to active profile.
     */
    public void initializeForProfile(Profile profile) {
        OmniboxPrerenderJni.get()
                .initializeForProfile(mNativeOmniboxPrerender, OmniboxPrerender.this, profile);
    }

    /**
     * Potentially invokes a pre-render or pre-connect given the url typed into the omnibox and a
     * corresponding autocomplete result. This should be invoked every time the omnibox changes
     * (e.g. As the user types characters this method should be invoked at least once per character)
     *
     * @param url url in the omnibox.
     * @param currentUrl url the current tab is displaying.
     * @param nativeAutocompleteResult native pointer to an autocomplete result.
     * @param profile profile instance corresponding to the active profile.
     * @param tab The tab whose webcontent's to use.
     */
    public void prerenderMaybe(
            String url,
            String currentUrl,
            long nativeAutocompleteResult,
            Profile profile,
            Tab tab) {
        OmniboxPrerenderJni.get()
                .prerenderMaybe(
                        mNativeOmniboxPrerender,
                        OmniboxPrerender.this,
                        url,
                        currentUrl,
                        nativeAutocompleteResult,
                        profile,
                        tab);
    }

    @NativeMethods
    interface Natives {
        long init(OmniboxPrerender caller);

        void clear(
                long nativeOmniboxPrerender,
                OmniboxPrerender caller,
                @JniType("Profile*") Profile profile);

        void initializeForProfile(
                long nativeOmniboxPrerender,
                OmniboxPrerender caller,
                @JniType("Profile*") Profile profile);

        void prerenderMaybe(
                long nativeOmniboxPrerender,
                OmniboxPrerender caller,
                String url,
                String currentUrl,
                long nativeAutocompleteResult,
                @JniType("Profile*") Profile profile,
                Tab tab);
    }
}
